home *** CD-ROM | disk | FTP | other *** search
- /*
- File: SplitSee.c
-
- Contains: A Sample MovieTalk Conferencing Application
-
- Written by: Guy Riddle
-
- Copyright: © 1994 by Apple Computer, Inc., all rights reserved.
-
- */
-
- #include <Types.h>
- #include <QuickDraw.h>
- #include <Fonts.h>
- #include <Events.h>
- #include <Windows.h>
- #include <Menus.h>
- #include <Dialogs.h>
- #include <Desk.h>
- #include <ToolUtils.h>
- #include <Memory.h>
- #include <SegLoad.h>
- #include <Files.h>
- #include <Folders.h>
- #include <OSUtils.h>
- #include <DiskInit.h>
- #include <Scrap.h>
-
- #include <String.h>
- #include <Strings.h>
- #include <stdio.h>
-
- #include <QuickTimeConferencing.h>
-
- #include "See.h"
-
- typedef EventRecord *EventRecordPtr;
- typedef Byte *BytePtr;
-
- #define MAXMEMBERS 5
-
- typedef struct {
- MTConferenceMember member;
- MTControllerComponent controller;
- } Member, *MemberPtr;
-
- Member gMember[MAXMEMBERS+1];
-
- Rect gWindowBox = { 100, 80, 220, 240 };
- Rect gVoiceBox = { 50, 180, 50, 380 };
-
- MTCString63 gUserName, vwTitle, awTitle;
-
- ComponentInstance gCC, gBC;
- MTConferenceToken gConference;
- MTControllerComponent gVoice;
-
- ComponentInstance gBD;
- Rect gTheDot = { 5, 5, 15, 15 };
- PixPatHandle gDotPat;
- RgnHandle gNoClip, gDotClip;
- RGBColor gDotColor;
-
- MemberPtr FindMember(MTConferenceMember);
-
- void Initialize(void);
- void StartMovieTalk(void);
- void InitializeBlueDot(void);
- void StopMovieTalk(void);
- void EventLoop(void);
-
- void DoToolboxEvent(EventRecordPtr);
- void DoKeyDownEvent(EventRecordPtr);
- void DoMouseDownEvent(EventRecordPtr);
- void DoDiskEvent(EventRecordPtr);
- void UpdateDot(void);
- void AdjustMenus(void);
- void DoMenuBar(long);
- void DoAppleMenu(short);
- void DoFileMenu(short);
- void DoVideoPhoneMenu(short);
- void DoMenuCall(void);
- void DoMenuHangUp(void);
- void DoMenuVoiceOn(void);
-
- void DoConferenceEvent(MTConferenceEventPtr);
- void DoConfReady(MTConferenceEventPtr);
- void DoMemberReady(MTConferenceEventPtr);
- void DoMemberTerminated(MTConferenceEventPtr);
- void DoConfTerminated(MTConferenceEventPtr);
- void DoAuxTerminated(MTConferenceEventPtr);
- void DoIncomingCall(MTConferenceEventPtr);
- void DoMemberJoining(MTConferenceEventPtr);
-
- void CallOne(MTNamePtr);
- void SaveMovie(Handle);
- void SaveSnapshot(Handle);
- void Sorry(int, int, MTConferenceMember, OSErr);
-
- /*
- * SplitSee
- *
- * Another sample conferencing application, compatible with the others in the
- * SeeWorld family. Differences between See and SplitSee are
- *
- * • Server passwords aren't supported
- *
- * • Incoming media windows are "auto-positioned" on the screen
- *
- * • To demonstrate use of auxiliary media streams, voice and sound are
- * separated and the sound can be added or removed during a conference
- *
- * • The self view window contains a Blue Dot to indicate the Happiness value
- * of the transmit flow control components.
- */
-
- void main()
- {
- Initialize();
- EventLoop();
- }
-
- void
- Initialize(
- void
- ){
- Handle menuBar;
- DialogPtr dp;
-
- InitGraf((Ptr) &qd.thePort);
- InitFonts();
- InitWindows();
- InitMenus();
- TEInit();
- InitDialogs(nil);
- InitCursor();
-
- dp = GetNewDialog(rAboutAlert, nil, (WindowRef) -1);
- DrawDialog(dp);
-
- StartMovieTalk();
- InitializeBlueDot();
-
- menuBar = GetNewMBar(rMenuBar);
-
- SetMenuBar(menuBar);
- DisposHandle(menuBar);
- AddResMenu(GetMHandle(mApple), 'DRVR');
- AppendMenu(GetMHandle(mVideoPhone), "\p(-;Talkies"); // (using the same See.r file)
-
- DrawMenuBar();
-
- DisposeDialog(dp);
- }
-
- void
- StartMovieTalk(
- void
- ){
- StringHandle sh;
-
- sh = GetString(kMTAppleTalkUserName);
-
- strncpy(gUserName, *sh+1, **sh);
- sprintf(vwTitle, "Silent %s", gUserName);
- sprintf(awTitle, "Voice of %s", gUserName);
-
- gCC = OpenDefaultComponent(kMTConferenceType, kMTMovieTalkSubType);
-
- gMember[0].controller = MTConferenceNewPreparedController(gCC, &gWindowBox,
- mtMediaSourcePrepMask+mtGrabVideoPrepMask+mtWindowVisiblePrepMask+mtControllerVisiblePrepMask+mtEnableSnapshotPrepMask+mtEnableRecordPrepMask,
- vwTitle);
-
- MTConferenceListen(gCC, vwTitle, gUserName, "mtlkatlk\tVideoPhone\x0Dmtlktcpi\t458\x0Dmtlkisdn\t-\x0D");
-
- gBC = OpenDefaultComponent(kMTBrowserType, kMTAppleTalkSubType);
- }
-
- void
- InitializeBlueDot(
- void
- ){
- SetPort((GrafPtr) MTControllerGetControllerPort(gMember[0].controller));
-
- gDotPat = NewPixPat();
-
- gNoClip = NewRgn();
- GetClip(gNoClip);
-
- gDotClip = NewRgn();
- OpenRgn();
- FrameOval(&gTheDot);
- CloseRgn(gDotClip);
- XorRgn(gNoClip, gDotClip, gDotClip);
-
- // gBD = OpenDefaultComponent(kMTMonitorType, kMTMovieTalkSubType);
- }
-
- void
- EventLoop(
- void
- ){
- EventRecord tEvent;
- MTConferenceEvent cEvent;
-
- for(;;){
- if(MTConferenceGetNextEvent(gCC, &cEvent))
- DoConferenceEvent(&cEvent);
-
- if(WaitNextEvent(everyEvent, &tEvent, 1, 0))
- DoToolboxEvent(&tEvent);
- else
- UpdateDot();
- }
- }
-
- void
- DoToolboxEvent(
- EventRecordPtr ev
- ){
- switch(ev->what){
- case mouseDown:
- DoMouseDownEvent(ev);
- break;
-
- case keyDown:
- DoKeyDownEvent(ev);
- break;
-
- case diskEvt:
- DoDiskEvent(ev);
- }
- }
-
- void
- UpdateDot(
- void
- ){
- long happy;
-
- if(!gConference)
- return;
-
- // happy = MTMonitorQueryHappiness(gBD);
- happy = 100;
-
- gDotColor.blue = 600 * happy;
- gDotColor.red = 60000 - gDotColor.blue;
-
- SetPort((GrafPtr) MTControllerGetControllerPort(gMember[0].controller));
-
- MakeRGBPat(gDotPat, &gDotColor);
- FillCOval(&gTheDot, gDotPat);
- }
-
- void
- DoMouseDownEvent(
- EventRecordPtr ev
- ){
- WindowPtr wp;
- short part;
-
- part = FindWindow(ev->where, &wp);
-
- switch(part){
- case inMenuBar:
- AdjustMenus();
- DoMenuBar(MenuSelect(ev->where));
- }
- }
-
- void
- DoKeyDownEvent(
- EventRecordPtr ev
- ){
- if(ev->modifiers & cmdKey){
- AdjustMenus();
- DoMenuBar(MenuKey(ev->message & charCodeMask));
- }
- }
-
- void
- DoDiskEvent(
- EventRecordPtr ev
- ){
- Point where;
-
- if(HiWord(ev->message)){
- SetPt(&where, kDILeft, kDITop);
- DIBadMount(where, ev->message);
- }
- }
-
- void
- AdjustMenus(
- void
- ){
- MenuHandle mh;
-
- mh = GetMHandle(mVideoPhone);
-
- gConference ? EnableItem(mh, iHangUp) : DisableItem(mh, iHangUp);
- FindMember(0) ? EnableItem(mh, iCall) : DisableItem(mh, iCall);
-
- CheckItem(mh, iVoiceOn, !!gVoice);
- (gConference && !gVoice) ? EnableItem(mh, iVoiceOn) : DisableItem(mh, iVoiceOn);
- }
-
- void
- DoMenuBar(
- long selection
- ){
- short menuID;
- short menuItem;
-
- menuID = HiWord(selection);
- menuItem = LoWord(selection);
-
- switch(menuID){
- case mApple:
- DoAppleMenu(menuItem);
- break;
-
- case mFile:
- DoFileMenu(menuItem);
- break;
-
- case mEdit: /* call SystemEdit for DA editing & MultiFinder */
- SystemEdit(menuItem-1);
- break;
-
- case mVideoPhone:
- DoVideoPhoneMenu(menuItem);
- }
-
- HiliteMenu(0);
- }
-
- void
- DoAppleMenu(
- short item
- ){
- DialogRef dp;
- Str255 daName;
- short itemHit;
-
- switch(item){
- case iAbout:
- dp = GetNewDialog(rAboutAlert, nil, (WindowRef) -1);
- SetDialogDefaultItem(dp, 1);
-
- ModalDialog(0, &itemHit);
-
- DisposeDialog(dp);
- break;
-
- default: /* all non-About items in this menu are DAs */
- GetItem(GetMHandle(mApple), item, daName);
- OpenDeskAcc(daName);
- }
- }
-
- void
- DoFileMenu(
- short item
- ){
- switch(item){
- case iQuit:
- StopMovieTalk();
-
- ExitToShell();
- }
- }
-
- void
- DoVideoPhoneMenu(
- short item
- ){
- switch(item){
- case iCall:
- DoMenuCall();
- break;
-
- case iHangUp:
- DoMenuHangUp();
- break;
-
- case iVoiceOn:
- DoMenuVoiceOn();
- }
- }
-
- void
- StopMovieTalk(
- void
- ){
- CloseComponent(gCC);
- CloseComponent(gBC);
- }
-
- void
- DoMenuCall(
- void
- ){
- MTNameListPtr names;
- MTNamePtr np;
- int count;
-
- if(MTBrowserBrowse(gBC, 0, "\pLets go Fishing…", "mtlkatlk\tVideoPhone\x0Dmtlkatlk\tMulticaster\x0D", 0, &names) != noErr)
- return;
-
- count = GetMTNameListCount(names);
- np = &(names->list[0]);
-
- while(--count >= 0)
- CallOne(np++);
-
- DisposeMTNameList(names);
- }
-
- void
- CallOne(
- MTNamePtr np
- ){
- MemberPtr mp;
-
- if(!(mp = FindMember(0)))
- return;
-
- mp->member = MTConferenceCall(gCC, "See Wiz", np);
- }
-
- void
- DoMenuHangUp(
- void
- ){
- MTConferenceTerminate(gCC, gConference);
- MTControllerSetClip(gMember[0].controller, 0, gNoClip);
- gConference = 0; // just to suppress menu choice
- }
-
- void
- DoMenuVoiceOn(
- void
- ){
- gVoice = MTConferenceNewPreparedController(gCC, &gVoiceBox,
- mtMediaSourcePrepMask+mtGrabAudioPrepMask+mtAuxiliaryClosePrepMask+mtWindowVisiblePrepMask+mtControllerVisiblePrepMask+mtEnableRecordPrepMask,
- awTitle);
-
- MTConferenceAttachAuxiliarySource(gCC, gConference, gVoice, awTitle);
- }
-
- void
- DoConferenceEvent(
- MTConferenceEventPtr ce
- ){
- switch(ce->what){
- case mtIncomingCallEvent:
- DoIncomingCall(ce);
- break;
-
- case mtMemberJoiningEvent:
- DoMemberJoining(ce);
- break;
-
- case mtConferenceReadyEvent:
- DoConfReady(ce);
- break;
-
- case mtConferenceTerminatedEvent:
- DoConfTerminated(ce);
- break;
-
- case mtAuxiliaryTerminatedEvent:
- DoAuxTerminated(ce);
- break;
-
- case mtMemberReadyEvent:
- DoMemberReady(ce);
- break;
-
- case mtMemberTerminatedEvent:
- DoMemberTerminated(ce);
- break;
-
- case mtRefusedEvent:
- Sorry(701, 1, ce->who, ce->err);
- break;
-
- case mtFailedEvent:
- Sorry(701, 2, ce->who, ce->err);
- break;
-
- case mtSnapshotTakenEvent:
- SaveSnapshot(ce->surprise);
- break;
-
- case mtMovieRecordedEvent:
- SaveMovie(ce->surprise);
- }
-
- if(ce->surprise)
- DisposeHandle(ce->surprise);
- }
-
- void
- DoIncomingCall(
- MTConferenceEventPtr ce
- ){
- MemberPtr mp;
- OSErr reason;
-
- reason = 0;
-
- if((ce->bonus & mtSendMediaModeMask) && !(ce->bonus & mtReceiveMediaModeMask))
- reason = mtConnectionRefusedErr; // no peeking
- else if(mp = FindMember(0))
- mp->member = ce->who;
- else{
- reason = paramErr;
-
- Sorry(702, 1, ce->who, 0);
- }
-
- MTConferenceReply(gCC, ce->who, reason);
- }
-
- void
- DoMemberJoining(
- MTConferenceEventPtr ce
- ){
- MemberPtr mp;
-
- if(mp = FindMember(0))
- mp->member = ce->who;
- else
- Sorry(702, 2, ce->who, 0);
- }
-
- void
- DoConfReady(
- MTConferenceEventPtr ce
- ){
- if(gConference)
- MTConferenceMerge(gCC, gConference, ce->who);
- else{
- MTControllerSetClip(gMember[0].controller, 0, gDotClip);
- MTConferenceActivateConference(gCC, gConference = ce->who, gMember[0].controller);
- }
- }
-
- void
- DoMemberReady(
- MTConferenceEventPtr ce
- ){
- MemberPtr mp;
- MTControllerComponent mtc;
-
-
- if(ce->bonus & mtReceiveMediaModeMask){
- if(!(mp = FindMember(ce->who)))
- return;
-
- mtc = MTConferenceNewPreparedController(gCC, &gWindowBox,
- mtAutoPositionPrepMask+mtWindowVisiblePrepMask+mtControllerVisiblePrepMask+mtEnableSnapshotPrepMask+mtEnableRecordPrepMask,
- MTConferenceGetMemberName(gCC, mp->member));
-
- mp->controller = mtc;
- }else
- mtc = 0;
-
- MTConferenceActivateMember(gCC, ce->who, mtc);
- }
-
- void
- DoMemberTerminated(
- MTConferenceEventPtr ce
- ){
- MemberPtr mp;
-
- if(!(mp = FindMember(ce->who)))
- return;
-
- if(mp->controller)
- MTConferenceDisposeController(gCC, mp->controller);
-
- mp->controller = 0;
- mp->member = 0;
- }
-
- void
- DoConfTerminated(
- MTConferenceEventPtr ce
- ){
- if(gConference == ce->who){
- MTControllerSetClip(gMember[0].controller, 0, gNoClip);
-
- gConference = 0;
- }
- }
-
- void
- DoAuxTerminated(
- MTConferenceEventPtr /* unused */
- ){
- MTConferenceDisposeController(gCC, gVoice);
-
- gVoice = 0;
- }
-
- void
- SaveSnapshot(
- Handle pic
- ){
- ZeroScrap();
-
- HLock(pic);
-
- PutScrap(GetHandleSize(pic), 'PICT', *pic);
- }
-
- void
- SaveMovie(
- Handle h
- ){
- Ptr p;
- int i;
- long dirid;
- short vrefnum;
- FSSpecPtr temp;
- FSSpec spec;
- Str255 newname;
-
- HLock(h);
- temp =(FSSpecPtr) *h;
-
- FindFolder(kOnSystemDisk, kDesktopFolderType, true, &vrefnum, &dirid);
- FSMakeFSSpec(vrefnum, dirid, "", &spec);
- FSpCatMove(temp, &spec); // move it to the desktop
-
- FSMakeFSSpec(vrefnum, dirid, temp->name, &spec);
- GetIndString(newname, rWildSTRs, srMovieName);
- p = strchr(newname, '?');
-
- for(i = 1; i < 10; i++){
- *p = '0'+i;
-
- if(FSpRename(&spec, newname) == noErr)
- return; // and give it a better name
- }
-
- SysBeep(1);
- }
-
- MemberPtr
- FindMember(
- MTConferenceMember who
- ){
- int i;
-
- for(i = 1; i <= MAXMEMBERS; i++)
- if(who == gMember[i].member)
- return(&gMember[i]);
-
- return(0);
- }
-
- void
- Sorry(
- int why,
- int note,
- MTConferenceMember who,
- OSErr err
- ){
- Str255 p1, p2, p3;
-
- GetIndString(p1, why, note);
-
- strcpy(p2, MTConferenceGetMemberName(gCC, who));
- sprintf(p3, "%d", err);
-
- ParamText("", p1, c2pstr(p2), c2pstr(p3));
-
- CautionAlert(why, 0);
- }